`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    19:58:43 09/28/2012 
// Design Name: 
// Module Name:    ReaderWriter 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module ReaderWriter(_clk_seg_i, Input_Parameter_i, escriba_i, lea_i, value_io, termino_o, fail_o, value_display_o, display_dos_o, direccion_o);
	
	//ENTRADAS
	 input _clk_seg_i; //Clock de 1 Hz
	 input [1:0] Input_Parameter_i;
	 input escriba_i;
	 input lea_i;
	 inout [7:0] value_io;
		 
	 //SALIDAS
	 output reg termino_o;
	 output reg fail_o;
	 output reg display_dos_o;
	 output reg [3:0] value_display_o;
	 output reg [3:0] direccion_o;
	 //QUEDE AJUSTANDO LA VARIABLE DE SALIDA QUE TENDRA LA RAM COMO ENTRADA PARA EL ADDRESS
	 reg [3:0] address = 0;
	 reg inicio;
	 reg [7:0] value_escribir_o,value_leer_i;
	 
	 always @(posedge _clk_seg_i)  //Cada vez que el clock pase a flanco positivo
	 begin
			if (inicio)
				begin
					//$display("inicie");	
					address =0;
					termino_o = 0;
					inicio = 0;
				end
			else if (lea_i)
				begin
					direccion_o <= address;
					if (address <= 15)
					begin
						if (Input_Parameter_i == 2'b00)
						begin
							if (value_leer_i==8'b00001111) fail_o =0;
							else fail_o =1;
						end
						else if (Input_Parameter_i == 2'b01)
						begin 
							if (value_leer_i==8'b00001010) fail_o =0 ;
							else fail_o =1;
						end
						else if (Input_Parameter_i == 2'b10) 
						begin
							if (value_leer_i==8'b00000101) fail_o =0 ;
							else fail_o =1;
						end 
						else if (Input_Parameter_i == 2'b11) 
						begin
							if (value_leer_i==address) fail_o =0 ;
							else fail_o =1;
						end 
						//$display("Address es: %d", address);
						if(value_leer_i >= 10)
						begin
							value_display_o = value_leer_i - 10;
							display_dos_o = 1;
						end
						else
						begin
							value_display_o = value_leer_i;
							display_dos_o = 0;
						end				
						if (address == 15)
						begin
							//$display("Termino de leer");
							termino_o=1;
							inicio=1;
						end
						address = address + 1;
					end//end del else if lea_i
				end//if inicio 
			else if (escriba_i) 
			begin
				direccion_o <= address;
				if (address <= 15)
				begin
					if (Input_Parameter_i == 2'b00) 
					begin
						value_display_o = 4'b0101;
						display_dos_o = 1'b1;
						value_escribir_o = 8'b00001111;
					end
					else if (Input_Parameter_i == 2'b01)
					begin
						value_display_o = 4'b0000;
						display_dos_o = 1'b1;
						value_escribir_o = 8'b00001010;
					end
					else if (Input_Parameter_i == 2'b10) 
					begin
						value_display_o = 4'b0101;
						display_dos_o = 1'b0;
						value_escribir_o = 8'b00000101;					
					end 
					else if (Input_Parameter_i == 2'b11) 
					begin	
						if(address >= 10)
						begin
							value_display_o = address - 10;
							display_dos_o = 1;
						end
						else
						begin
							value_display_o = address;
							display_dos_o = 0;
						end
						value_escribir_o = address;					
					end 								
					//$display("Address es: %d", address);
					//$display("Inicio es: %d", inicio);				
					if (address == 15)
					begin
						//$display("Termino de escribir");
						termino_o=1;
						inicio=1;
					end
					address = address + 1;
					
				end//end del else if escriba_i
			else
				begin
					inicio=1;
					display_dos_o = 0;
					value_display_o = 0;
				end
		end//end del always
		end
		assign value_io = (escriba_i) ? value_escribir_o : (lea_i) ? value_leer_i : 8'bz;
endmodule
